package io;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * JAVA IO
 * IO:Input,Output  输入与输出
 *
 * java.io.InputStream
 * 所有字节输入流的超类,它定义了所有字节输入流都应当具备的读取字节的相关方法
 *
 * java.io.OutputStream
 * 所有字节输出流的超类,它定义了所有字节输出流都应当具备的写出字节的相关方法
 *
 * 将输入流和输出流理解为是连接程序和另一端的"管道",使得数据(2进制字节数据)可以向同一侧顺序移动.
 *
 * 将来开发中我们对不同设备进行读写操作时,可以使用专门连接该设备的流,从该设备读取数据就创建对应的
 * 输入流,如果是向该设备发送数据则创建对应的输出流即可.而无论操作什么设备,对于流而言的操作都输基于
 * 读写数据进行的.
 *
 *
 * 例如:
 * 对硬盘上某个文件进行读写操作,此时我们需要使用可以连接到文件上的管道"文件流"
 * java.io.FileInputStream
 * 文件输入流是连接程序与文件的管道,用于从文件中读取数据的流
 *
 * java.io.FileOutputStream
 * 向文件中写出数据的流
 */
public class FosDemo {
    public static void main(String[] args) throws IOException {
        /*
            向文件fos.dat中写入数据
            创建:文件输出流

            文件输出流常见构造器
            FileOutputStream(String filename)

            FileOutputStream(File file)
         */
        //        File file = new File("./fos.dat");
//        FileOutputStream fos = new FileOutputStream(file);
        /*
            文件流在创建时如果发现指定的文件不存在时会自动将该文件创建出来,但前提是该文件所在的
            目录必须存在,否则会抛出异常:FileNotFoundException
         */
        FileOutputStream fos=new FileOutputStream("./fos.dat");
       // FileOutputStream fos1=new FileOutputStream("./aba/fos.dat");//输出错误
        fos.write(1);

        /*
        向文件中第二个字节,内容00000010

        fos.dat的内容:
        00000001 00000010
         */

        fos.write(2);

        fos.close();//流最终使用完毕后要记得关闭


    }
}
 /*
            字节输出流超类:
            java.io.OutputStream中定义了写出字节的方法:

            void write(int d)
            通过当前输出流向目标位置写出1个字节.写出的是给定的int对应2进制的"低八位"
         */

        /*
            1   10^0
           10   10^1
          100   10^2
         1000   10^3
                                                    8421
            0000        0                           0001        1    2^0
            0001        1                           0010        2    2^1
            0010        2                           0100        4    2^2
            0011        3                           1000        8    2^3
            0100        4
            0101        5                           1010    8+2=10
            0110        6                           1101    8+4+1=13
            0111        7                          10010    16+2=18
            1000        8
            1001        9
            1010        10
            1011        11
            1100        12
            1101        13
            1110        14
            1111        15


            在使用2进制表示数字时,最高的二进制位是符号为,0表示正数,1表示负数
            后面的2进制则是数据位,意味着最大的2进制则表示的数也越大

            00000000 00000000 00000000 00000001   2^31
            01111111 11111111 11111111 11111111  +最大值

            10000000 00000000 00000000 00000000  -最小值
            11111111 11111111 11111111 11111111  -1
         */

        /*
            向fos.dat中写入一个字节,二进制的样子"00000001"

            int型2进制整数1:
            00000000 00000000 00000000 00000001
                                       ^^^^^^^^
                                       实际写出

            fos.write(1)以后,fos.dat文件中:
            00000001
         */